﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using modele.interfaces;
using modele.impl;

namespace UI
{
    /// <summary>
    /// Logique d'interaction pour MenuWindow.xaml
    /// </summary>
    /**
     * \file MenuWindow.xaml.cs
     * \brief Fenêtre de démarrage de notre application
     * \author Alexandre Carteron et Charles Robin
     * \version 1.0
     * \date 13/12/2012
     * 
     * Fenêtre de démarrage de notre application
     */
    public partial class MenuWindow : Window
    {
        VueMenu listeJoueurs; /*!<Liste des joueurs*/
        protected bool IsMouseMoving { get; set; } /*!<Indique si on est en train de déplacer la fenêtre*/
        protected Point MousePosition { get; set; } /*!<Position actuelle de la souris*/

        /**
        * \fn public MenuWindow()
        * \brief Constructeur de la classe MenuWindow
        * 
        * Constructeur de la première MenuWindow
        * 
        */
        public MenuWindow()
        {
            InitializeComponent();
            //this.Background = new ImageBrush(new BitmapImage(new Uri(@"pack://application:,,,/myapp;Resources/Menu.png")));
            listeJoueurs = new VueMenu();
            ChoixNbJoueurCombo.ItemsSource = listeJoueurs;
            ChoixNbJoueurCombo.SelectedItem = ChoixNbJoueurCombo.Items.GetItemAt(0);
        }

        /**
         * \fn public void OnMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
         * \brief Commence à déplacer la fenêtre lorsque le clic gauche est enfoncé
         * 
         * Commence à déplacer la fenêtre lorsque le clic gauche est enfoncé
         * 
         */
        private void OnMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            MousePosition = e.GetPosition(this);
            IsMouseMoving = true;
        }

        /**
         * \fn public void OnMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
         * \brief Arrête le déplacement la fenêtre lorsque le clic gauche est relâché
         * 
         * Arrête le déplacement la fenêtre lorsque le clic gauche est relâché
         * 
         */
        private void OnMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
        {
            IsMouseMoving = false;
        }

        /**
         * \fn public void MenuClose(object sender, MouseButtonEventArgs e)
         * \brief Gère la fermeture de l'application
         * 
         * Gère la fermeture de l'application
         * 
         */
        private void MenuClose(object sender, RoutedEventArgs e)
        {
            Close();
            Application.Current.Shutdown();
        }

        /**
         * \fn public void OnMouseMove(object sender, MouseButtonEventArgs e)
         * \brief Gère le déplacement de l'application
         * 
         * Gère le déplacement de l'application
         * 
         */
        private void OnMouseMove(object sender, MouseEventArgs e)
        {
            if (e.LeftButton == MouseButtonState.Pressed && IsMouseMoving)
            {
                Point pnt = e.GetPosition(this);
                double dDeltaX = pnt.X - MousePosition.X;
                double dDeltaY = pnt.Y - MousePosition.Y;
                Left = Left + dDeltaX;
                Top = Top + dDeltaY;
            }
        }

        /**
         * \fn public void lancerPartie(object sender, MouseButtonEventArgs e)
         * \brief Gère le démarrage de la partie
         * 
         * Gère le démarrage de la partie
         * 
         */
        private void lancerPartie(object o, RoutedEventArgs args)
        {
            int taille = 25;
            if (ChoixCarteCombo.Items.IndexOf(ChoixCarteCombo.SelectedItem) == 1)
                taille = 100;

            List<Joueur> joueurs = new List<Joueur>();
            int nbJoueurs = ChoixNbJoueurCombo.SelectedIndex + 2;
            joueurs.Add(new JoueurImpl(nomJ1.Text, ((ComboBoxItem)civilisationJ1.SelectedItem).Tag.ToString(), "rouge"));

            joueurs.Add(new JoueurImpl(nomJ2.Text, ((ComboBoxItem)civilisationJ2.SelectedItem).Tag.ToString(), "bleu"));
            if (nbJoueurs > 2)
                joueurs.Add(new JoueurImpl(nomJ3.Text, ((ComboBoxItem)civilisationJ3.SelectedItem).Tag.ToString(), "jaune"));
            if (nbJoueurs > 3)
                joueurs.Add(new JoueurImpl(nomJ4.Text, ((ComboBoxItem)civilisationJ4.SelectedItem).Tag.ToString(), "vert"));
            joueurs.Shuffle();
            JeuImpl.INSTANCE.joueurs = joueurs;
            JeuImpl.INSTANCE.joueurCourant = 0;

            MainWindow m = new MainWindow(taille);
            m.Visibility = Visibility.Visible;

            this.Close();
        }

        /**
         * \fn public void changementTailleCarte(object sender, MouseButtonEventArgs e)
         * \brief Appelé lorsque l'on passe d'un carte petite à grande et inversement
         * 
         * Appelé lorsque l'on passe d'un carte petite à grande et inversement
         * 
         */
        private void changementTailleCarte(object sender, SelectionChangedEventArgs e)
        {

            if(ChoixNbJoueurCombo != null)
            if (ChoixCarteCombo.Items.IndexOf(ChoixCarteCombo.SelectedItem) == 0){// && init !=0
                listeJoueurs.retirerJoueur();
                ChoixNbJoueurCombo.SelectedItem = ChoixNbJoueurCombo.Items.GetItemAt(0);
            }
            else {
                listeJoueurs.ajouterJoueur();
            }
        }

        /**
         * \fn public void changementNbJoueurs(object sender, MouseButtonEventArgs e)
         * \brief Appelé lorsque l'on change le nombre de joueur
         * 
         * Appelé lorsque l'on change le nombre de joueur
         * 
         */
        private void changementNbJoueurs(object sender, SelectionChangedEventArgs e)
        {
            if (ChoixNbJoueurCombo != null) {
                if (ChoixNbJoueurCombo.Items.IndexOf(ChoixNbJoueurCombo.SelectedItem) == 0)
                {
                    nomJ3.IsEnabled = false;
                    nomJ4.IsEnabled = false;
                    civilisationJ3.IsEnabled = false;
                    civilisationJ4.IsEnabled = false;
                }
                else if (ChoixNbJoueurCombo.Items.IndexOf(ChoixNbJoueurCombo.SelectedItem) == 1)
                {
                    nomJ3.IsEnabled = true;
                    nomJ4.IsEnabled = false;
                    civilisationJ3.IsEnabled = true;
                    civilisationJ4.IsEnabled = false;
                }
                else if (ChoixNbJoueurCombo.Items.IndexOf(ChoixNbJoueurCombo.SelectedItem) == 2)
                {
                    nomJ3.IsEnabled = true;
                    nomJ4.IsEnabled = true;
                    civilisationJ3.IsEnabled = true;
                    civilisationJ4.IsEnabled = true;
                }
            }
       }
    }

    /**
     * 
     * Classe d'extension des méthodes appliquées aux listes
     * 
     */
    static class MyExtensions
    {
        static readonly Random Random = new Random();

        /**
         * \fn public void changementTailleCarte(object sender, MouseButtonEventArgs e)
         * \brief Méthode de mélange des joueurs
         * 
         * Méthode de mélange des joueurs
         * 
         * \param[in] list Liste à mélanger
         * 
         */
        public static void Shuffle<T>(this IList<T> list)
        {
            int n = list.Count;
            while (n > 1)
            {
                n--;
                int k = Random.Next(n + 1);
                T value = list[k];
                list[k] = list[n];
                list[n] = value;
            }
        }
    }
}
